/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package efe;

import java.io.File;
import java.io.IOException;
import java.util.StringTokenizer;
import jpcap.*;

/**
 * Metody statyczne i stałe programu.
 * @author root
 */
public class JpcapTools {
    /**
     * rozszerzenie dla pliku z pakietem TCP
     */
    public static String TCPExtension = "efetcp";
    /**
     * rozszerzenie dla pliku z pakietem UDP
     */
    public static String UDPExtension = "efeudp";
    /**
     * rozszerzenie dla pliku z pakietem ICMP
     */
    public static String ICMPExtension = "efeicmp";
    /**
     * rozszerzenie dla pliku z pakietem ARP
     */
    public static String ARPExtension = "efearp";

    
    /**
     * Wbiera interfejs za pomocą którego będą przesyłane ramki.
     * @param i numer interfejsu zaczynając od 0 zgodnie z kolejnością, którą
     * zwraca funkcja getDeviceList()
     * @return wybrany interfejs
     */
    public static JpcapSender getSendingDevice(int i) throws IOException {
        NetworkInterface[] devices = JpcapCaptor.getDeviceList();
        try {
            return JpcapSender.openDevice(devices[i]);
        } catch (IOException ex) {
            return null;
        }
    }

    /**
     * Zwraca opisy urządzeń sieciowych w Systemie.
     * @return tablica opisów urządzeń
     */
    public static String[] getDevList() {
        jpcap.NetworkInterface[] devs = jpcap.JpcapCaptor.getDeviceList();
        String[] devlist = new String[devs.length];
        for (int i = 0; i < devs.length; ++i) {
            devlist[i] = devs[i].name + "(" + devs[i].description
                    + ") datalink: "+devs[i].datalink_name + "("
                    + devs[i].datalink_description + ") "
                    + "IntAddr:";
            for (jpcap.NetworkInterfaceAddress a: devs[i].addresses) {
                devlist[i] += " " + a.address;
            }
            devlist[i] += " MAC: ";
            for (byte b : devs[i].mac_address)
                devlist[i] += Integer.toHexString(b & 0xff) + ":";
        }
        return devlist;
    }

    /**
     * Zamienia tablicę bajtów na napis w postaci 0xXX 0xXX...
     * @param in tablica bajtów
     * @return napis
     */
    public static String byteArrayToHexString(byte in[]) {
        byte ch = 0x00;
        int i = 0;
        if (in == null || in.length <= 0) return null;
        String pseudo[] = {"0", "1", "2", "3", "4", "5", "6", "7",
                           "8", "9", "A", "B", "C", "D", "E", "F"};
        StringBuffer out = new StringBuffer(in.length * 2);
        while (i < in.length) {
            ch = (byte) (in[i] & 0xF0); // Strip off high nibble
            ch = (byte) (ch >>> 4); // shift the bits down
            ch = (byte) (ch & 0x0F); // must do this is high order bit is on!
            out.append("0x");
            out.append(pseudo[ (int) ch]); // convert the nibble to a String Character
            ch = (byte) (in[i] & 0x0F); // Strip off low nibble
            out.append(pseudo[ (int) ch]); // convert the nibble to a String Character
            out.append(" ");
            i++;
        }
        String rslt = new String(out);
        return rslt;
    }

    /**
     * Zamienia napis w postaci 0xXX 0xXX... na tablicę bajtów.
     * @param s wejściowy napis
     * @return tablica bajtów
     */
    public static byte[] hexStringToByteArray(String s) {
        StringTokenizer st = new StringTokenizer(s);
        byte[] b = new byte[st.countTokens()];
        for (int i = 0; i < b.length; ++i) {
            b[i] = Integer.decode(st.nextToken()).byteValue();
        }
        return b;
    }

    /**
     * Zwraca roszerzenie pliku.
     * @return rozszerzenie
     */
    public static String getExtension(File f) {
        String ext = null;
        String s = f.getName();
        int i = s.lastIndexOf('.');

        if (i > 0 &&  i < s.length() - 1) {
            ext = s.substring(i+1).toLowerCase();
        }
        return ext;
    }

    
}
